package feeinterface.protocol.req;

import org.apache.log4j.Logger;

import com.ulwx.tool.ByteUtils;
import com.ulwx.tool.HttpUtils;
import com.ulwx.tool.StringUtils;

import feeinterface.dao.LibVerListDao;
import feeinterface.dao.ServiceCoDao;
import feeinterface.modeldb.LibVerList;
import feeinterface.modeldb.ServiceCo;
import feeinterface.protocol.res.Res010009;
import feeinterface.protocol.utils.Constants;
import feeinterface.utils.URLConfig;

/**
 * 类库下载/升级（代码010009） 下载的URL均为服务器生成，返回至客户端，不需要客户端拼接，直接请求该URL即可下载（get方式）。
 * 包下载完成之后存到存储卡替换旧版本
 * 
 * @author 黄杰
 * 
 */
public class Pro010009 extends ProExchange {
	private  static  Logger log = Logger.getLogger(Pro010009.class); // 跟类名一样

	@Override
	public Object genBean() throws Exception {
		Res010009 res = new Res010009();
		// 获取下载/升级类库信息
		try {
			if (this.IsUpdate == Constants.UpdateOrDown.DOWNLOAD
					&& this.ver == 0) {
				res.Status = Constants.DownStatus.ERROR;
				res.Message = "下载版本号码为0！";
				return res;
			}
			ServiceCo service = ServiceCoDao.getBy(this.COID);
			LibVerList libVerList = LibVerListDao.getLibList(COID,
					service.getServiceCpID(),IMSI, Platform, VmVer,
					IsUpdate, Test, ver);
			// 如果没有类库信息或者下载地址不存在，则直接返回
			if (libVerList == null
					|| StringUtils.isEmpty(libVerList.getDownloadURl())) {
				log.debug("找不到下载URL！");
				res.Status = Constants.DownStatus.ERROR;
				res.Message = "找不到下载URL！";
				return res;
			}
			// 如果是升级，则判断是否有信息类库，并且是否需要升级
			if (this.IsUpdate == Constants.UpdateOrDown.UPDATE) {
				// 客户端版本号已经是最新版本
				int libver = libVerList.getLibVer();
				if (this.ver > libver) {
					log.debug("客户端已经是最新版本，无需更新！");
					res.Status = Constants.DownStatus.NOT_UPDATE;
					res.Message = "客户端已经是最新版本，无需更新！";
					return res;
				}
			}

			// 下载协议
			byte[] bt = new byte[0];
			if (StringUtils.hasText(libVerList.getDownloadURl())) {
				String url = URLConfig.FileServer + libVerList.getDownloadURl();
				try {
					bt = HttpUtils.getBytes(url, Constants.HTTP.TimeOut);
				} catch (Exception ex) {
					log.error("下载资源出错!", ex);
					throw new ExchangeException(Constants.DownStatus.ERROR,
							"下载资源出错!");
				}
			} else {
				log.debug("没有找到对应的下载URL！");
				throw new ExchangeException(Constants.DownStatus.ERROR,
						"没有找到对应的下载URL！");
			}
			log.debug("bt=" + bt + ";bt.length=" + bt.length);
			if (bt != null && bt.length > 1) {
				// 打印日志
				log.debug("下载字节码：\n" + ByteUtils.format(bt));
			}
			res.Status = Constants.DownStatus.UPDATE;
			res.Message = "成功！";
			res.Packet = bt;
		} catch (Exception e) {
			log.error("找不到相应的软件资源!" + e);
			throw new ExchangeException(Constants.DownStatus.ERROR,
					"找不到相应的软件资源!");
		}
		return res;
	}

	@Override
	public String validate() throws Exception {
		if (COID == null)
			return "网络繁忙，请重新登录再试!";
		if (IMSI == null)
			IMSI = "";
		if (Platform == null)
			return "网络繁忙，请重新登录再试!";
		if (VmVer == null)
			return "网络繁忙，请重新登录再试!";
		return null;
	}

	/**
	 * 合作id
	 */
	public Integer COID;
	/**
	 * 包id
	 */
	public String PacketID;
	/**
	 * 用户卡串号
	 */
	public String IMSI;
	/**
	 * 当前客户端库的版本号，如果客户端本地不存在计费模块，需要从服务器下载计费模块，则传0
	 */
	public Integer ver;
	/**
	 * 1：下载 2：升级 如果是下载，则服务器根据ver直接下载
	 * 如果是升级，则服务器根据ver来判断当前是否有比ver更新的版本，如果有则升级，如果没有则不需要升级
	 */
	public Integer IsUpdate;
	/**
	 * 短信中心号码，允许为空
	 */
	public String SmsCenter;
	/**
	 * 虚拟机版本号
	 */
	public Integer VmVer;
	/**
	 * 平台简称
	 */
	public String Platform;
	/**
	 * 是否用于pc模拟器测试 1：是 0：否
	 */
	public Integer Test = 0;

	/**
	 * 构造函数
	 */
	public Pro010009() {
		this.Protocol = "010009";
	}
}
